package dxf.sections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;


import dxf.DXFElement;
import dxf.annotations.DXFElementType;
import dxf.annotations.DXFSubElements;
import dxf.annotations.DXFTerminator;
import dxf.entities.Entity;

/**
 * La classe <code>Entities</code> rappresenta una sezione ENTITIES in un DXFFile.
 *
 * @author Andrea Zonca
 * @author Michele Brignoli
 * @version 2.0
 */

@DXFElementType("SECTION")
@DXFTerminator("ENDSEC")
public class Entities implements DXFElement, Iterable<Entity>  {

	@DXFSubElements
	List<Entity> entities;

	/**
	 * Crea un'istanza di Entities, creando un vettore di Entity
	 */
	public Entities() {
		entities = new ArrayList<Entity>();
	}

	/**
	 * Aggiunge una entity alla collezione
	 *
	 * @param entity la entity da aggiungere
	 * @return l'oggetto che ha chiamato il metodo
	 */
	public Entities add(Entity entity) {
		entities.add(entity);
		return this;
	}

	/**
	 * Aggiunge due entity alla collezione
	 *
	 * @param entity1 la prima entity da aggiungere
	 * @param entity2 la seconda entity da aggiungere
	 * @return l'oggetto che ha chiamato il metodo
	 */
	public Entities add(Entity entity1, Entity entity2){
		entities.add(entity1);
		entities.add(entity2);
		return this;
	}

	/**
	 * Aggiunge quattro entity alla collezione
	 *
	 * @param entity1 la prima entity da aggiungere
	 * @param entity2 la seconda entity da aggiungere
	 * @param entity3 la terza entity da aggiungere
	 * @param entity4 la quarta entity da aggiungere
	 * @return l'oggetto che ha chiamato il metodo
	 */
	public Entities add(Entity entity1, Entity entity2, Entity entity3, Entity entity4){
		entities.add(entity1);
		entities.add(entity2);
		entities.add(entity3);
		entities.add(entity4);
		return this;
	}

	/**
	 * Rimuove la entity passata come parametro
	 *
	 * @param entity la entity da rimuovere
	 * @return l'oggetto che ha chiamato il metodo
	 */
	public Entities remove(Entity entity) {
		entities.remove(entity);
		return this;
	}

	/**
	 * Rimuove tutte le entity
	 *
	 * @return l'oggetto che ha chiamato il metodo
	 */
	public Entities clear() {
		entities.clear();
		return this;
	}

	/**
	 * Consente l'iterazione sulle entity
	 *
	 * @return l'iteratore sull'insieme di entity
	 */
	@Override
	public Iterator<Entity> iterator() {
		return entities.iterator();
	}

	/**
	 * Restituisce una versione non modificabile delle entity
	 *
	 * @return la versione non modificabile delle entity
	 */
	public Iterable<Entity> getEntities(){
		return Collections.unmodifiableCollection(entities);
	}
}
